perm filename BRIDGE.SAI[ALS,ALS] blob sn#268565 filedate 1977-03-15 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "FOURSOME"
C00003 00003	SAVEI DOI REDOI SAVEK DOK REDOK SAVEM DOM REDOM SAVEN DON REDON DOERR REDOERR DOX REDOX EVAL
C00010 00004	$ Main program starts here
C00017 ENDMK
C⊗;
BEGIN "FOURSOME";
DEFINE ⊂="BEGIN",⊃="END",$="COMMENT";
DEFINE BOARDS="6",PLAYERS="16";
INTEGER ARRAY SET,SET1[0:16,0:6];	$ Trial and best array;
INTEGER ARRAY HIT,HIT1[0:16,0:16];	$ Hits;
INTEGER ARRAY NONO,NONO1[0:16,0:16];	$ Pardners;
INTEGER ARRAY ISAVE,KSAVE,MSAVE,NSAVE,HSAVE[0:25];
INTEGER ARRAY PSAVE,QSAVE[0:96];
PRELOAD_WITH 0,1,2,3,4,1,3,2,4,2,1,3,4,4,1,3,2,3,2,1,4,2,3,4,1,0;
INTEGER ARRAY TAB[0:97];
INTEGER B,H,I,J,K,L,M,N,P,Q,R,T,U,V,W,X,Y;
INTEGER CHAN,HITMAX,HITNUM,HITMA2,HITNU2,HITSUM,HITSUM2,HFINAL;
STRING TALLY,SUMMARY;
COMMENT SAVEI DOI REDOI SAVEK DOK REDOK SAVEM DOM REDOM SAVEN DON REDON DOERR REDOERR DOX REDOX EVAL;

PROCEDURE SAVEI;
⊂ SET[I,J]←(T LSH 27); ISAVE[B]←PSAVE[X]←I;
  OUTSTR(CVS(I)&",");
  SUMMARY←SUMMARY&CVS(I)&",";
⊃;

PROCEDURE DOI;
⊂ FOR I←1 STEP 1 UNTIL 16  DO IF SET[I,J]=0 THEN DONE;
  PSAVE[X]←I;
  IF I≤16 THEN  SAVEI;
⊃;

PROCEDURE REDOI;
⊂
 I←ISAVE[B]; K←KSAVE[B];
 OUTSTR('15&'12&"("&CVS(B)&")-I"&CVS(I)&",");
 FOR I←PSAVE[X]+1 STEP 1 UNTIL 16 DO IF SET[I,J]=0 THEN DONE;
 PSAVE[X]←I;
 IF I≤16 THEN SAVEI ELSE SET[ISAVE[B],J]←0;
⊃;

PROCEDURE SAVEK;
⊂ KSAVE[B]←PSAVE[X]←K; QSAVE[X]←L;
  SET[K,J]←(T LSH 27)+(I LSH 18); NONO[I,K]←NONO[K,I]←1;
  SET[I,J]←SET[I,J]+(K LSH 18);
  HIT[I,K]←HIT[I,K]+1;
  HIT[K,I]←HIT[K,I]+1;
  OUTSTR(CVS(K)&",");
  SUMMARY←SUMMARY&CVS(K)&",";
⊃;


PROCEDURE DOK;
⊂ FOR L←0 STEP 1 UNTIL 6 DO
  ⊂ "LL"
    FOR K←1 STEP 1 UNTIL 16 DO
    IF (SET[K,J]=0)∧(NONO[I,K]=0)∧(HIT[I,K]≤L)  THEN DONE "LL";
  ⊃ "LL";
  PSAVE[X]←K; QSAVE[X]←L;
  IF K≤16 THEN SAVEK;
⊃;

PROCEDURE REDOK;
⊂ K←KSAVE[B]; M←MSAVE[B]; N←NSAVE[B];
  NONO[I,K]←NONO[K,I]←0;
  SET[I,J]←SET[I,J]-(K LSH 18);
  HIT[I,K]←HIT[I,K]-1;
  HIT[K,I]←HIT[K,I]-1;
  OUTSTR("-K"&CVS(K)&",");
  FOR K←PSAVE[X]+1 STEP 1 UNTIL 16 DO
    IF (SET[K,J]=0)∧(NONO[I,K]=0)∧(HIT[I,K]≤QSAVE[X]) THEN DONE;
  PSAVE[X]←K;
  IF K≤16 THEN SAVEK ELSE SET[KSAVE[B],J]←0;
⊃;

PROCEDURE SAVEM;
⊂  SET[M,J]←(T LSH 27)+(I LSH 9)+K;
  SET[I,J]←SET[I,J]+(M LSH 9); SET[K,J]←SET[K,J]+(M LSH 9);
  HIT[M,I]←HIT[M,I]+1; HIT[M,K]←HIT[M,K]+1;
  HIT[I,M]←HIT[I,M]+1; HIT[K,M]←HIT[K,M]+1;
  MSAVE[B]←PSAVE[X]←M; QSAVE[X]←Q;
  OUTSTR(CVS(M)&",");
  SUMMARY←SUMMARY&CVS(M)&",";
⊃;

PROCEDURE DOM;
⊂ FOR Q←0 STEP 1 UNTIL 6 DO
  ⊂ "QQ"
    FOR M←1 STEP 1 UNTIL 16 DO
     IF (SET[M,J]=0)∧((HIT[I,M]+HIT[K,M])≤Q) THEN DONE "QQ";
  ⊃ "QQ";
  PSAVE[X]←M; QSAVE[X]←Q;
  IF M≤16 THEN SAVEM;
⊃;
  
PROCEDURE REDOM;
⊂ M←MSAVE[B]; Q←QSAVE[X]; N←NSAVE[B];
  OUTSTR("-M"&CVS(M)&",");
  SET[I,J]←SET[I,J]-(M LSH 9);  SET[K,J]←SET[K,J]-(M LSH 9);
  HIT[I,M]←HIT[I,M]-1; HIT[K,M]←HIT[K,M]-1;
  HIT[M,I]←HIT[M,I]-1; HIT[M,K]←HIT[M,K]-1;
  FOR M←PSAVE[X]+1 STEP 1 UNTIL 16 DO
    IF (SET[M,J]=0)∧((HIT[I,M]+HIT[K,M])≤QSAVE[X]) THEN DONE;
  PSAVE[X]←M;
  IF M≤16 THEN SAVEM ELSE SET[MSAVE[B],J]←0;
⊃;

PROCEDURE SAVEN;
⊂ SET[N,J]←(T LSH 27)+(M LSH 18)+(I LSH 9)+K;
  SET[M,J]←SET[M,J]+N LSH 18;
  SET[K,J]←SET[K,J]+N;  SET[I,J]←SET[I,J]+N;
  NSAVE[B]←PSAVE[X]←N; QSAVE[X]←R;
  HIT[I,N]←HIT[N,I]←HIT[I,N]+1;  HIT[K,N]←HIT[N,K]←HIT[N,K]+1;
  HIT[M,N]←HIT[N,M]←HIT[N,M]+1;
  NONO[M,N]←NONO[N,M]←1;
  OUTSTR(CVS(N)&" 	");
  SUMMARY←SUMMARY&CVS(N)&" 	";
⊃;

PROCEDURE DON;
⊂   FOR R←0 STEP 1 UNTIL 6 DO
  ⊂ "RR"
     FOR N←1 STEP 1 UNTIL 16 DO
 IF (SET[N,J]=0)∧(NONO[M,N]=0)∧((HIT[I,N]+HIT[K,N]+HIT[M,N])≤R) THEN DONE "RR";
  ⊃ "RR";
  PSAVE[X]←N;
  IF N≤16 THEN SAVEN;
⊃;

PROCEDURE REDON;
⊂ N←NSAVE[B]; R←QSAVE[X]; I←ISAVE[B]; K←KSAVE[B]; M←MSAVE[B];
  OUTSTR("-N"&CVS(N)&",");
  SET[I,J]←SET[I,J]-N; SET[K,J]←SET[K,J]-N;
  SET[M,J]←SET[M,J]-N;
  HIT[N,I]←HIT[I,N]←HIT[I,N]-1; HIT[N,K]←HIT[K,N]←HIT[K,N]-1;
  NONO[M,N]←NONO[N,M]←0;
  FOR N←PSAVE[X]+1 STEP 1 UNTIL 16 DO
   IF (SET[N,J]=0)∧(NONO[M,N]=0)∧((HIT[I,N]+HIT[K,N]+HIT[M,N])≤R) THEN DONE;
  PSAVE[X]←N;
  IF N≤16 THEN SAVEN ELSE SET[NSAVE[B],J]←0;
⊃;

PROCEDURE DOERR;
⊂ OUTSTR("DOERR "); ⊃;

PROCEDURE REDOERR;
⊂ OUTSTR("REDOERR "); ⊃;


PROCEDURE DOX;
⊂ Y←(X MOD 4); IF Y=0 THEN Y←4;
   CASE Y OF ⊂ DOERR; DOI; DOK; DOM; DON; ⊃;
⊃;
PROCEDURE REDOX;
⊂ Y←(X MOD 4);  IF Y=0 THEN Y←4;
  CASE Y OF ⊂ REDOERR;  REDOI; REDOK; REDOM; REDON; ⊃;
⊃;

PROCEDURE EVAL;
⊂ OUTSTR("EVAL ");
  H←0;
  FOR V←1 STEP 1 UNTIL 16 DO
    FOR W←1 STEP 1 UNTIL 16 DO IF HIT[V,W]>1 THEN  H←H+HIT[V,W]-1;
  IF H<HFINAL THEN 
  ⊂ ARRTRAN(SET1,SET); ARRTRAN(HIT1,HIT);
    ARRTRAN(NONO1,NONO); HFINAL←H; ⊃;
    OUTSTR(" H="&CVS(H)&'15&'12);
⊃;
$ Main program starts here;
CHAN←1;
HFINAL←256;
T←B←J←X←0;
WHILE TRUE DO
  ⊂ "LOOP"
    WHILE TRUE DO
    ⊂ "FORWARD"
      X←X+1;
      IF (X MOD 4)=1 THEN
      ⊂ B←B+1;T←T+1; IF T>4 THEN T←T-4; 
        IF (B MOD 4)=1 THEN
        ⊂ J←J+1; T←J; IF T>4 THEN T←T-4; IF T<1 THEN T←T+4;
      IF X≤96 THEN ⊂ OUTSTR('15&'12&
"Round "&CVS(J)&" ("&CVS(X)&"/"&CVS(J)&","&CVS(B)&","&CVS(T)&")"&'15&'12);
SUMMARY←SUMMARY&'15&'12&
"Round "&CVS(J)&" ("&CVS(X)&"/"&CVS(J)&","&CVS(B)&","&CVS(T)&")"&'15&'12; ⊃
      ELSE ⊂ EVAL; IF H≤144  THEN DONE "LOOP";  DONE "FORWARD"; ⊃; ⊃;
      ⊃;
      DOX;
      IF PSAVE[X]>16 THEN DONE "FORWARD";
    ⊃ "FORWARD";
    WHILE TRUE DO
    ⊂ "BACKWARD"
      X←X-1;
      IF X≤1 THEN DONE "LOOP";
      IF (X MOD 4)=0 THEN
      ⊂ B←B-1; T←T-1; IF T>1 THEN T←4;
        OUTSTR('15&'12&"("&CVS(B)&")");
        I←ISAVE[B]; K←KSAVE[B]; M←MSAVE[B]; N←NSAVE[B];
        IF (B MOD 4)=0 THEN ⊂ J←J-1; T←J; IF T>4 THEN T←T-4;
        IF J<6 THEN
        OUTSTR('15&'12&"("&CVS(X)&"/"&CVS(J)&","&CVS(B)&":"&CVS(T)&")"); ⊃; ⊃;
      REDOX;
      IF PSAVE[X]≤16 THEN DONE "BACKWARD";
    ⊃ "BACKWARD";
  ⊃ "LOOP";

TALLY←"\|\\M1CORON;\M2BDI40;\M3NGR40;";
P←0;
FOR I←1 STEP 1 UNTIL 16 DO
⊂ "III"
  TALLY←TALLY&"\F1	Player No. "
&CVS(I)&'11&"Name"&'15&'12&'15&'12&"\F2Round	Table		With		Score"&'15&'12;
  FOR J←1 STEP 1 UNTIL 6 DO
  ⊂ "JJJ"
    T←LDB(POINT(9,SET1[I,J],8));
    K←LDB(POINT(9,SET1[I,J],17));
    TALLY←TALLY&CVS(J)&'11&'11&CVS(T)&'11&'11&CVS(K)&'15&'12;
  ⊃ "JJJ";
  TALLY←TALLY&"\F3"&'11&'11&'11&'11&'11&"Total"&'15&'12&'15&'12&'15&'12;
  P←P+1;  IF P=3 THEN
   ⊂ P←0;  TALLY←TALLY&'14; ⊃ ELSE  TALLY←TALLY&'15&'12&'15&'12&'15&'12;
⊃ "III";
TALLY←TALLY&SUMMARY&'15&'12&'14;
CLOSE(CHAN); OPEN(CHAN,"DSK",0,0,2,0,0,0); 
ENTER(CHAN,"TALLY[ALS,ALS]",0);
OUT(CHAN,TALLY); CLOSE(CHAN);
⊃ "FOURSOME";